home *** CD-ROM | disk | FTP | other *** search
- ; Program to convert KERMIT.EXE to all printable characters. For each
- ; byte of the file, convert to two characters in the range 20 to 2F.
- ; This is done by adding a space to each nibble. The file KERMIT.FIX
- ; is created with 64 characters per line.
- ;
- ; Daphne Tzoar
- ; 1/83
- ; Columbia University Center for Computing Activities
-
- DOS EQU 21H
-
- STACK SEGMENT PARA STACK 'STACK'
- DW 100 DUP (0)
- STK EQU THIS WORD
- STACK ENDS
-
- DATAS SEGMENT PARA PUBLIC 'DATAS'
- buff db 80H DUP(0)
- bufone db 80H DUP(0)
- buftwo db 80H DUP(0)
- fcbold db 25H DUP(0)
- fcbnew db 25H DUP(0)
- oldstk dw ?
- kold db 'KERMIT EXE$'
- knew db 'KERMIT FIX$'
- chrcnt db 0
- datcnt db 0
- eoflag db 0
- crflg db 0
- cnt db 0
- DATAS ENDS
-
- MAIN SEGMENT PARA PUBLIC 'MAIN'
- START PROC FAR
- ASSUME CS:MAIN,DS:DATAS,SS:STACK,ES:NOTHING
-
- push ds ; Initialization
- sub ax,ax
- push ax
-
- mov ax,datas
- mov ds,ax
- sub ax,ax
-
- mov oldstk,sp
-
- mov ah,1AH ; Use my own DTA
- mov dx,offset buff
- int dos
- call one
- mov sp,oldstk
- ret
- START ENDP
-
- ONE PROC NEAR
- mov bx,offset fcbold
- mov ah,0
- mov [bx],ah ; Use default drive.
- inc bx
- mov di,offset kold ; Get name of original file.
- kerm3: mov ah,[di]
- cmp ah,'$' ; Got all the data?
- je kerm4
- mov [bx],ah
- inc di
- inc bx
- jmp kerm3
- kerm4: mov bx,offset fcbnew
- mov ah,0
- mov [bx],ah
- inc bx
- mov di,offset knew
- kerm5: mov ah,[di]
- cmp ah,'$'
- je kerm6
- mov [bx],ah
- inc di
- inc bx
- jmp kerm5
-
- kerm6: mov ax,0
- mov bx,offset fcbold+0CH
- mov [bx],ax ; Zero current block number.
- mov bx,offset fcbold+0EH
- mov [bx],ax ; Lrecl.
- mov bx,offset fcbold+20H
- mov [bx],ah ; Current record (of block).
- inc bx
- mov [bx],ax ; Current record (of file).
- mov bx,offset fcbold+23H
- mov [bx],ax
- mov ah,0FH ; Open file.
- mov dx,offset fcbold
- int dos
-
- mov ax,0
- mov bx,offset fcbnew+0CH
- mov [bx],ax ; Zero current block number.
- mov bx,offset fcbnew+0EH
- mov [bx],ax ; Lrecl.
- mov bx,offset fcbnew+20H
- mov [bx],ah ; Current record (of block).
- inc bx
- mov [bx],ax ; Current record (of file).
- mov bx,offset fcbnew+23H
- mov [bx],ax
- mov ah,16H ; Create file.
- mov dx,offset fcbnew
- int dos
- mov eoflag,0 ; Not end-of-file yet.
- mov datcnt,0 ; Chars in write-out buffer.
- mov chrcnt,0 ; Chars in read-to buffer.
- mov crflg,0
- mov cnt,0
- mov bx,offset bufone
- mov di,offset buftwo
-
- kerm1: cmp chrcnt,0H
- jne kerm0
- call inbuf ; Get a buffer-full.
- jmp kerm9
- mov ax,ds
- mov es,ax ; Move for Dest uses ES register.
- mov si,offset buff
- push di
- mov di,offset bufone ; Move read-in data to bufone.
- mov cx,80H
- rep movs es:bufone,buff
- pop di
-
- mov bx,offset bufone ; Where the chars are.
- mov chrcnt,80H ; Number of chars.
- kerm0: cmp datcnt,80H
- je kerm2
- dec chrcnt
- mov ah,[bx] ; Get a char.
- mov ch,ah ; Save here.
- and ah,0F0H ; Get high nibble.
- and ch,0FH ; Lower nibble.
- mov cl,4
- shr ax,cl
- add ah,' ' ; Make printable.
- mov [di],ah
- inc datcnt
- inc di
- add ch,' '
- mov [di],ch
- inc datcnt
- inc di
- inc bx
- add cnt,2
- cmp cnt,40H ; Time to add CRLF?
- jne kerm1
- mov cnt,0 ; Reset counter.
- cmp datcnt,80H ; Have room for it?
- jne kerm8 ; Yup, we do.
- mov crflg,0FFH
- jmp kerm2
-
- kerm8: mov crflg,0
- mov ax,0A0DH
- mov [di],ax
- inc di
- inc di
- add datcnt,2
- jmp kerm1
-
- kerm2: mov ax,ds
- mov es,ax ; Move for Dest uses ES register.
- mov si,offset buftwo
- mov di,offset buff
- mov cx,80H
- rep movs es:buff,buftwo ; Must use BUFF for r/w to file.
-
- mov ah,15H ; Write out to file two.
- mov dx,offset fcbnew
- int dos
- mov datcnt,0
- mov di,offset buftwo ; Start at beginning of buffer.
- cmp crflg,0FFH ; Had our buffer filled prior to CRLF?
- je kerm8 ; Yup.
- jmp kerm1 ; Get new buffer-full.
-
- kerm9: mov ah,10H ; Close files.
- mov dx,offset fcbold
- int dos
- mov dx,offset fcbnew
- int dos
- ret
-
- inbuf: cmp eoflag,0 ; End of file?
- je inbuf0 ; Nope.
- ret
- inbuf0: mov dx,offset fcbold
- mov ah,14H ; Read from file.
- int dos
- cmp al,0
- je inbuf2
- mov eoflag,0FFH
- inbuf2: jmp rskp
- ONE ENDP
-
- RSKP PROC NEAR
- pop bp
- add bp,3
- push bp
- ret
- RSKP ENDP
-
- MAIN ENDS
- END START